﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Ruandao.MiniAccess.SQLite3;
using System.Reflection;
using Ruandao.MiniAccess;

namespace TestSqlite
{
    public class TestDBAccess : SQLiteAccess
    {
        static readonly TestDBAccess instance = new TestDBAccess();

        private TestDBAccess()
            : base(Assembly.GetAssembly(typeof(TestDBAccess)), "TestDB", DBHelper.ConnectionString)
        {

        }

        static TestDBAccess() { }

        public static TestDBAccess GetInstance()
        {
            return instance;
        }

    }

    /// <summary>
    /// Table [WithoutKey] MiniAccess Entity Class 
    /// </summary>
    public class WithoutKeyEntity : EntityBase<WithoutKeyEntity>
    {
        #region Construct

        public WithoutKeyEntity()
            : base(TestDBAccess.GetInstance())
        {
            // 此处无需代码。
        }

        #endregion

        #region Get and Set Properties for All Columns.

        private Int64 field1 = 0;
        public Int64 Field1
        {
            get { return this.field1; }
            set
            {
                if (this.IsDelete) throw new OrMapException("不能修改已经标识为删除的实体的属性。");
                if (this.field1 != value)
                {
                    if (!this.IsNew) ChangePropertyValue("field1", this.field1);
                    this.field1 = value;
                }
            }
        }

        private Int64 field2 = 0;
        public Int64 Field2
        {
            get { return this.field2; }
            set
            {
                if (this.IsDelete) throw new OrMapException("不能修改已经标识为删除的实体的属性。");
                if (this.field2 != value)
                {
                    if (!this.IsNew) ChangePropertyValue("field2", this.field2);
                    this.field2 = value;
                }
            }
        }

        private Int64 field3 = 0;
        public Int64 Field3
        {
            get { return this.field3; }
            set
            {
                if (this.IsDelete) throw new OrMapException("不能修改已经标识为删除的实体的属性。");
                if (this.field3 != value)
                {
                    if (!this.IsNew) ChangePropertyValue("field3", this.field3);
                    this.field3 = value;
                }
            }
        }
        #endregion

        #region 获取主键所对应外键表的实体集合。
        // 函数名以Get打头，后面接着是外键表的名称，最后是Entities后缀。


        #endregion

        #region 获取外键所对应的实体。
        // 函数名以Get打头，后面部分是外键的名称，如果外键的名称以"FK_<表名>_"开始，则只取后半部分的名称。


        #endregion

        #region static Method

        // 根据主键查找和删除实体的函数。



        // 获取表中的所有记录。
        public static IList<WithoutKeyEntity> GetAllEntities()
        {
            return TestDBAccess.GetInstance().SearchEntities<WithoutKeyEntity>("");
        }

        // 根据条件查找表中的记录。
        public static IList<WithoutKeyEntity> SearchEntities(string condition, params object[] parameters)
        {
            return TestDBAccess.GetInstance().SearchEntities<WithoutKeyEntity>(condition, parameters);
        }
        // 根据条件查找表中的记录。
        public static IList<WithoutKeyEntity> SearchEntities(string condition)
        {
            return TestDBAccess.GetInstance().SearchEntities<WithoutKeyEntity>(condition);
        }

        public static void Delete(int f1, int f2, int f3)
        {
            TestDBAccess.GetInstance().DeleteEntities<WithoutKeyEntity>("WHERE Field1=" + f1.ToString() + " AND Field2=" + f2.ToString() + " AND Field3=" + f3.ToString());
        }
        #endregion

    }

    /// <summary>
    /// Table [UserInfo] MiniAccess Entity Class 
    /// </summary>
    public class UserInfoEntity : EntityBase<UserInfoEntity>
    {
        #region Construct

        public UserInfoEntity()
            : base(TestDBAccess.GetInstance())
        {
            // 此处无需代码。
        }

        #endregion

        #region Get and Set Properties for All Columns.

        private Int64 id = 0;
        public Int64 Id
        {
            get { return this.id; }
            set
            {
                if (this.IsDelete) throw new OrMapException("不能修改已经标识为删除的实体的属性。");
                if (this.id != value)
                {
                    if (!this.IsNew) ChangePropertyValue("id", this.id);
                    this.id = value;
                }
            }
        }

        private string name = String.Empty;
        public string Name
        {
            get { return this.name; }
            set
            {
                if (this.IsDelete) throw new OrMapException("不能修改已经标识为删除的实体的属性。");
                if (this.name != value)
                {
                    if (!this.IsNew) ChangePropertyValue("name", this.name);
                    this.name = value;
                }
            }
        }


        #endregion

        #region 获取主键所对应外键表的实体集合。
        // 函数名以Get打头，后面接着是外键表的名称，最后是Entities后缀。


        #endregion

        #region 获取外键所对应的实体。
        // 函数名以Get打头，后面部分是外键的名称，如果外键的名称以"FK_<表名>_"开始，则只取后半部分的名称。


        #endregion

        #region static Method

        // 根据主键查找和删除实体的函数。



        // 获取表中的所有记录。
        public static IList<UserInfoEntity> GetAllEntities()
        {
            return TestDBAccess.GetInstance().SearchEntities<UserInfoEntity>("");
        }

        // 根据条件查找表中的记录。
        public static IList<UserInfoEntity> SearchEntities(string condition, params object[] parameters)
        {
            return TestDBAccess.GetInstance().SearchEntities<UserInfoEntity>(condition, parameters);
        }
        // 根据条件查找表中的记录。
        public static IList<UserInfoEntity> SearchEntities(string condition)
        {
            return TestDBAccess.GetInstance().SearchEntities<UserInfoEntity>(condition);
        }
        #endregion

    }
}
